/*
 * Stone.js - Copyright (C) 2015, 乐悠族 <willove520@gmail.com>
 * 根据节点顺序实现简单、便捷的存取数据。
 * 数据存储在window.Stone对象中，如果需要在其他地方存储，可以自己实现。
 * 此项目采用LGPL协议开源，您修改源码后务必保证遵循此协议开源并提供修改文档说明。
 */
;
(function(root, factory) {

    'use strict';

    if (typeof define == 'function' && define.amd) {
        define(factory);
    } else if (typeof module == 'object' && typeof module.exports == 'object') {
        module.exports = factory();
    } else {
        root.Stone = factory();
    }
}(this, function() {
    var stone = {};
    return {
        set: function(key, value) {
            // 节点序列切割
            key = key.split('.');
            // 定义stone的节点配置对象
            var _node = stone;
            // 节点查找长度
            var count = 0;
            // 遍历节点
            for (var i = 0,
                    len = key.length; i < len; i++) {
                // 判断是否已经到达节点底层
                if (++count == len) {
                    _node[key[i]] = value;
                } else {
                    // 节点对象不存在则新建
                    typeof _node[key[i]] == 'undefined' && (_node[key[i]] = {});
                }
                // 节点对象替换到下层深度
                _node = _node[key[i]];
            }
            return stone;
        },
        get: function(key) {
            // 未配置key则返回stone对象
            if (typeof key == 'undefined') {
                return stone;
            }
            // 节点序列切割
            key = key.split('.');
            // 定义stone的节点查找对象
            var _node = stone;
            // 节点查找长度
            var count = 0;
            // 定义一个返回值
            var _ = undefined;
            // 遍历节点
            for (var i = 0,
                    len = key.length; i < len; i++) {
                // 未存在的节点直接返回
                if (typeof _node[key[i]] == 'undefined') {
                    return undefined;
                }
                // 判断是否已经到达节点底层
                if (++count == len) {
                    _ = _node[key[i]];
                    return _;
                }
                // 节点对象替换到下层深度
                _node = _node[key[i]];
            }
            return _;
        }
    }
}));